import { useMemberStore } from "@/stroes";

// 默认的基础 URL
export const defaultBaseURL = import.meta.env.VITE_BASE_URL; // 可以通过环境变量设置

// 添加拦截器
const httpInterceptor = {
  invoke(options: UniApp.RequestOptions) {
    // 使用请求中传入的 baseURL，或者使用默认的 baseURL
    const baseUrl = options.baseURL || defaultBaseURL;

    // 1. 非 http 开头需拼接地址
    if (options?.url && !options.url.toUpperCase().startsWith("HTTP")) {
      options.url = baseUrl + options.url;
    }

    // 2. 请求超时，默认 10 秒
    options.timeout = options.timeout || 10000;

    // 3. 添加小程序端请求头标识
    options.header = {
      ...options.header,
      // "Content-Type": "application/json",  // 可根据需求启用
    };

    // 4. 添加 token 请求头标识
    // #ifdef MP-WEIXIN
    const memberStore = useMemberStore();
    const token = memberStore.userinfo.token;
    if (token) {
      console.log("token:", token);
      options.header.Authorization = `Bearer ${token}`;
    }
    // #endif

    // #ifdef H5
    // 5. 允许跨域携带 Cookie
    options.withCredentials = true;
    options.header.withCredentials = true;
    // #endif
  },
};

uni.addInterceptor("request", httpInterceptor);
uni.addInterceptor("uploadFile", httpInterceptor);

/**
 * 通用请求函数
 * @param options 请求配置
 * @returns Promise 返回请求结果
 */
type Data<T> = {
  code: string;
  msg: string;
  data: any;
};

export const http = (options: any) => {
  console.log("拦截器开始处理请求:", options.url);
  return new Promise((resolve, reject) => {
    uni.request({
      ...options,
      success(res: any) {
        if (res.statusCode >= 200 && res.statusCode < 300) {
          resolve(res.data);
          if (res.code === 400) {
            const memberStore = useMemberStore();
            memberStore.clearProfile();
            reject(res);
          }
          return resolve(res.data);
        } else if (res.statusCode === 401) {
          const memberStore = useMemberStore();
          memberStore.clearProfile();
          uni.navigateTo({ url: "/pages/login/login" });
          reject(res);
        } else {
          uni.showToast({
            icon: "none",
            title: (res.data as Data<any>).msg || "请求错误",
          });
          reject(res);
        }
      },
      fail(err: any) {
        console.log(err);
        uni.showToast({
          icon: "none",
          title: "网络错误，换个网络试试",
        });
        reject(err);
      },
    });
  });
};
